﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
using System.Web.Security;
using File_Manager.Models;
using PagedList;
/*Envío de Correos*/
using System.Net;
using System.Net.Mail;
using System.Data;
using System.IO;
using System.Net.Mime;

namespace File_Manager.Controllers
{
    public class AccountController : Controller
    {

        private CYTContext db = new CYTContext();
        //
        // GET: /Account/LogOn

        public ActionResult LogOn(string ReturnUrl, string registro, string msn)
        {

            if (ReturnUrl != null)
            {
                if (Membership.GetUser() != null)
                {
                    ViewBag.Mensaje = "NO tiene Permisos para acceder a esta Página, o NO se ha verificado su pago de Cuota";
                    ViewBag.NOTAlow = "NO se ha verificado su pago de Cuota";
                }
            }
            else
            {
                if (registro != null)
                {
                    ViewBag.Mensaje = registro;
                    ViewBag.msn = msn;
                }
                else {
                    if (Membership.GetUser() != null) {
                        return RedirectToAction("Index", "Home");
                    }
                }
            }

            return View();
        }
        //
        // POST: /Account/LogOn

        [HttpPost]
        public ActionResult LogOn(LogOnModel model, string returnUrl)
        {
            if (ModelState.IsValid)
            {
                if (Membership.ValidateUser(model.UserName, model.Password))
                {
                    FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);

                    /***********************************************************************************************/
                    /****************************VERIFICACIÓN de VENCIMIENTO de Cuotas******************************/
                    /***********************************************************************************************/

                    var currentRol = Roles.GetRolesForUser(model.UserName).FirstOrDefault();

                    if (currentRol=="Admin")
                    {
                        var dateToday = DateTime.Now.Date;
                        var exp_date02 = db.ModoPago.Where(m => m.idModoPago == 2).ToList().FirstOrDefault().exp_date02;
                        var exp_date03 = db.ModoPago.Where(m => m.idModoPago == 3).ToList().FirstOrDefault().exp_date03;
                        
                        if (dateToday==exp_date02)
                        {
                            var User_I = db.User_I.Where(m => (m.idModoPago == 2 || m.idModoPago == 3) && m.verificado02==null).ToList();

                            foreach (var user in User_I)
                            {
                                var idRolOLD = Roles.GetRolesForUser(user.UserName).FirstOrDefault();
                                Roles.RemoveUserFromRole(user.UserName, idRolOLD);
                                Roles.AddUserToRole(user.UserName, "Guest_Fail");

                                user.idStatus = 4;
                                db.Entry(user).State = EntityState.Modified;
                                db.SaveChanges();
                            }

                        }
                        else if (dateToday==exp_date03)
                        {
                            var User_I = db.User_I.Where(m => m.idModoPago == 3 && m.verificado03==null).ToList();

                            foreach (var user in User_I)
                            {
                                var idRolOLD = Roles.GetRolesForUser(user.UserName).FirstOrDefault();
                                Roles.RemoveUserFromRole(user.UserName, idRolOLD);
                                Roles.AddUserToRole(user.UserName, "Guest_Fail");

                                user.idStatus = 4;
                                db.Entry(user).State = EntityState.Modified;
                                db.SaveChanges();
                            }
                        }

                    }

                    /***********************************************************************************************/
                    /***********************************************************************************************/
                    if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/")
                        && !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\"))
                    {
                        return Redirect(returnUrl);
                    }
                    else
                    {
                        return RedirectToAction("Index", "Home");
                    }
                }
                else
                {
                    ModelState.AddModelError("", "El Usuario o Clave proporcinados son incorrectos / o el Usuario NO se encuentra ACTIVO.");
                }
            }

            // If we got this far, something failed, redisplay form
            return View(model);
        }

        //
        // GET: /Account/LogOff

        public ActionResult LogOff()
        {
            FormsAuthentication.SignOut();

            return RedirectToAction("LogOn", "Account");
        }

        //
        // GET: /Account/Register

        public ActionResult Register()
        {
            // SE DEBE INCLUIR LOS DATOS DE CRECE Y TRIUNFA
            // creación de una SELECTLIST a partir de un array de SELECTLISTITEMS
            /*IEnumerable<SelectListItem> roles = new SelectList(new[]
                {
                    new SelectListItem{ Value = "Guest_C", Text = "Ciencias de la Salud" },
                    new SelectListItem{ Value = "Guest_H", Text = "Humanidades y Sociales" },
                    new SelectListItem{ Value = "Guest_I", Text = "Ingeniería y Ciencias Básicas" }
                }, "Value", "Text");*/


            ViewBag.idRol = new SelectList(db.Rol, "idRol", "name");
            ViewBag.idTurno = new SelectList(db.Turno, "idTurno", "name");
            ViewBag.idSede = new SelectList(db.Sede, "idSede", "name");
            ViewBag.idModoPago = new SelectList(db.ModoPago, "idModoPago", "name");
            ViewBag.idFormaPago = new SelectList(db.FormaPago, "idFormaPago", "name");

            return View();
        }

        //
        // POST: /Account/Register

        [HttpPost]
        public ActionResult Register(ParentModelViewRegistro model, string idRol, int idTurno, int idSede, int idModoPago, int idFormaPago)
        {
            if (ModelState.IsValid)
            {
                if(model.RegisterModel.Password==model.RegisterModel.ConfirmPassword){

                    if(model.RegisterModel.Email==model.RegisterModel.c_Email){

                        var user_old = (from m in db.User_I
                                        where m.UserName == model.RegisterModel.UserName
                                        select m).FirstOrDefault();
                        if (user_old == null)
                        {
                            if (verificaCupo(idTurno, idSede))
                            {
                                // Attempt to register the user
                                MembershipCreateStatus createStatus;
                                Membership.CreateUser(model.RegisterModel.UserName, model.RegisterModel.Password, model.RegisterModel.Email, null, null, false, null, out createStatus); /*Valor en FALSE isAproved */

                                if (createStatus == MembershipCreateStatus.Success)
                                {
                                    Roles.AddUserToRole(model.RegisterModel.UserName, idRol);

                                    model.User_I.UserName = model.RegisterModel.UserName;
                                    model.User_I.registerDate = DateTime.Now;
                                    model.User_I.idTurno = idTurno;
                                    model.User_I.idSede = idSede;
                                    model.User_I.idModoPago = idModoPago;
                                    model.User_I.idStatus = 1; //Status Pendiente = 1
                                    model.User_I.idRol = idRol; //Guest_C, Guest_H, Guest_I
                                    model.User_I.n_cuotas_pago = 1; //Primera Cuota Pagada
                                    model.User_I.idFormaPago = idFormaPago;
                                    model.User_I.transactionDate = DateTime.Now.Date;
                                    model.User_I.verificado = "NO"; //verificado = SI, verificado = NO
                                    model.User_I.idFormaPago02 = idFormaPago;
                                    model.User_I.idFormaPago03 = idFormaPago;

                                    db.User_I.Add(model.User_I);
                                    db.SaveChanges();

                                    /***********************************************************************************************/
                                    /******************************* ENVÍO DE CORREO DE NOTIFICACIÓN *******************************/
                                    /***********************************************************************************************/
                                    var turno = db.Turno.Find(model.User_I.idTurno).name;
                                    var sede = db.Sede.Find(model.User_I.idSede).name;
                                    var cuotas = db.ModoPago.Find(model.User_I.idModoPago).n_cuotas;
                                    var to = db.Mail.Find(1).name;
                                    var bodySendCorreo = "Estimado ADMINISTRADOR: <br /> <br />SE REQUIERE APROBAR LA SOLICITUD DE INSCRIPCIÓN correspondiente al estudiante "+
                                                         "<font style='text-transform: uppercase;'>"+model.User_I.name+ " "+model.User_I.last_name+"</font>"+
                                                         " de N° de C.I.: V-" + model.User_I.UserName + " para el Turno <font style='text-transform: uppercase;'>" + turno +
                                                         "</font> en la sede <font style='text-transform: uppercase;'>" + sede + "</font>.";
                                    var subjectSend = "CYT Validación Solicitud Inscripción, Cuota (" + model.User_I.n_cuotas_pago + "/" + cuotas + ") " + model.User_I.UserName + ".";
                                    var msn = "";

                                    //Envio de correo
                                    var result = sendEmail(to, subjectSend, bodySendCorreo, true);
                                    if (result)
                                    {
                                        msn = "Correo de Validación de Inscripción enviado Correctamente";
                                    }
                                    else
                                    {
                                        msn = "No se pudo enviar el Correo de Validación de Inscripción debido a problemas con el servidor";
                                    }

                                    /***********************************************************************************************/
                                    /***********************************************************************************************/

                                    /*FormsAuthentication.SetAuthCookie(model.UserName, false);*/
                                    var registro = "Usuario " + model.RegisterModel.UserName + " fue Creado Exitosamente, espere que el Administrador realice su Activación.";
                                    return RedirectToAction("LogOn", "Account", new { registro = registro, msn =  msn});
                                }
                                else
                                {
                                    ModelState.AddModelError("", ErrorCodeToString(createStatus));
                                }
                            }
                            else
                            {
                                ModelState.AddModelError("", "El Turno con la Sede Seleccionada No esta Abierto o se encuentra Completo, por favor seleccione otra combinación disponible(Turno/Sede)");
                            }
                        }
                        else 
                        {
                            ModelState.AddModelError("", "El Número de Cédula ya existe en la BD");
                        }
                    }
                    else 
                    {
                        ModelState.AddModelError("", "El Correo y el Correo de Confirmación NO coninciden");
                    }
                }
                else 
                {
                    ModelState.AddModelError("", "La Contraseña y la Contraseña de Confirmación NO coninciden");
                }
            }

            ViewBag.idRol = new SelectList(db.Rol, "idRol", "name",idRol);
            ViewBag.idTurno = new SelectList(db.Turno, "idTurno", "name",idTurno);
            ViewBag.idSede = new SelectList(db.Sede, "idSede", "name",idSede);
            ViewBag.idModoPago = new SelectList(db.ModoPago, "idModoPago", "name",idModoPago);
            ViewBag.idFormaPago = new SelectList(db.FormaPago, "idFormaPago", "name",idFormaPago);
            // If we got this far, something failed, redisplay form
            return View(model);
        }

        //
        // GET: /Account/ChangePassword

        [Authorize]
        public ActionResult ChangePassword()
        {
            return View();
        }

        //
        // POST: /Account/ChangePassword

        [Authorize]
        [HttpPost]
        public ActionResult ChangePassword(ChangePasswordModel model)
        {
            if (ModelState.IsValid)
            {

                // ChangePassword will throw an exception rather
                // than return false in certain failure scenarios.
                bool changePasswordSucceeded;
                try
                {
                    MembershipUser currentUser = Membership.GetUser(User.Identity.Name, true /* userIsOnline */);
                    changePasswordSucceeded = currentUser.ChangePassword(model.OldPassword, model.NewPassword);
                }
                catch (Exception)
                {
                    changePasswordSucceeded = false;
                }

                if (changePasswordSucceeded)
                {
                    return RedirectToAction("ChangePasswordSuccess");
                }
                else
                {
                    ModelState.AddModelError("", "La contraseña es incorrecta o la nueva contraseña es invalida.");
                }
            }

            // If we got this far, something failed, redisplay form
            return View(model);
        }

        //
        // GET: /Account/ChangePasswordSuccess
        [Authorize]
        public ActionResult ChangePasswordSuccess()
        {
            return View();
        }

        //***********************************************************************************//
        // Autor:  		Adrian Di Puglia			                	     				*//
        //***********************************************************************************//
        // SearchIndex()	Acceso ADMINISTRADOR						        			*//
        // Acción que devuelve la vista de todos los ítems de Usario listados, 		        *//
        // 	paginados y con opción de búsqueda.												*//
        // _________________________________________________________________________________*//
        // Entrada: 																		*//
        // •	Page: entero que denota el numero de pagina que se tiene en la lista de 	*//
        // 		búsqueda, por defecto es 1.													*//
        // •	Parámetros con prefijo search: caracteres por los cuales se va a filtrar la *//
        // 		búsqueda. 																	*//
        // •	Parámetros con prefijo current: caracteres que guardan la ultima búsqueda de*// 
        // 		filtrado para mantenerla durante los cambios de página. 					*//
        // _________________________________________________________________________________*//
        // Salida:  Vista que posee todos los Usarios listados deseados.				    *//
        // _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        public ActionResult SearchIndex(string currentName, string searchName, string currentLastName, string searchLastName,
                                        int? SearchTurno, int? SearchSede, int? SearchModoPago, string SearchRol, int? SearchStatus, int? page = 1)
        {

            var user = db.User_I.AsQueryable();
            var User_IList = new List<User_I>();

            //Metodo GET Inicializar las variables con los valores de busqueda introducidos
            if (Request.HttpMethod == "GET")
            {
                searchName = currentName;
                searchLastName = currentLastName;
                ViewBag.SearchTurno = new SelectList(db.Turno, "idTurno", "name");
                ViewBag.SearchSede = new SelectList(db.Sede, "idSede", "name");
                ViewBag.SearchModoPago = new SelectList(db.ModoPago, "idModoPago", "name");
                ViewBag.SearchRol = new SelectList(db.Rol, "idRol", "name");
                ViewBag.SearchStatus = new SelectList(db.Status, "idStatus", "name");
            }
            else
            {
                page = 1;
            }

            //Metodo POST Inicializar las variables con los valores de busqueda introducidos
            ViewBag.CurrentName = searchName;
            ViewBag.CurrentLastName = searchLastName;

            ViewBag.SearchTurno = new SelectList(db.Turno, "idTurno", "name", SearchTurno);
            ViewBag.CurrentTurno = SearchTurno;

            ViewBag.SearchSede = new SelectList(db.Sede, "idSede", "name", SearchSede);
            ViewBag.CurrentSede = SearchSede;

            ViewBag.SearchModoPago = new SelectList(db.ModoPago, "idModoPago", "name", SearchModoPago);
            ViewBag.CurrentModoPago = SearchModoPago;

            ViewBag.SearchRol = new SelectList(db.Rol, "idRol", "name", SearchRol);
            ViewBag.CurrentRol = SearchRol;

            ViewBag.SearchStatus = new SelectList(db.Status, "idStatus", "name", SearchStatus);
            ViewBag.CurrentStatus = SearchStatus;

            int pageSize = 10;
            int pageIndex = (page ?? 1);

            //Filtrado por los parametros en entrada capturado en al interfaz
            if (SearchTurno == null && SearchSede == null && SearchModoPago == null && SearchRol == null && SearchStatus == null)
            {
                User_IList = user.ToList();
            }
            else
            {
                if (SearchTurno != null)
                {
                    user = user.Where(m => m.idTurno == SearchTurno);
                }

                if (SearchSede != null)
                {
                    user = user.Where(m => m.idSede == SearchSede);
                }

                if (SearchModoPago != null)
                {
                    user = user.Where(m => m.idModoPago == SearchModoPago);
                }

                if (SearchRol != "" && SearchRol != null)
                {
                    user = user.Where(m => m.idRol == SearchRol);
                }

                if (SearchStatus != null)
                {
                    user = user.Where(m => m.idStatus == SearchStatus);
                }
            }

            if (!String.IsNullOrEmpty(searchName))
            {
                user = user.Where(m => m.name.Contains(searchName));
            }

            if (!String.IsNullOrEmpty(searchLastName))
            {
                user = user.Where(m => m.last_name.Contains(searchLastName));
            }

            //Ordenar los User del return
            User_IList = user.OrderBy(x => x.registerDate).ToList();

            return View(User_IList.ToPagedList(pageIndex, pageSize));
        }

        //***********************************************************************************//
        // Autor:  			Adrian Di Puglia	                		     				*//
        //***********************************************************************************//
        // Details()	Acceso ADMINISTRADOR									        	*//
        // Función que devuelve la vista de los detalles de un usuario especificado.    	*//
        // _________________________________________________________________________________*//
        // Entrada: 																		*//
        // •	id: identificador del usuario que se desea ver los detalles. 		    	*//
        // _________________________________________________________________________________*//
        // Salida:  Vista que posee todos los datos de lausuario desado.	    			*//
        // _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        public ViewResult Details(string id)
        {
            MembershipUser currentUser = Membership.GetUser(id);

            UserModel EditModel = new UserModel
            {
                UserName = currentUser.UserName,
                Email = currentUser.Email,
                CreationDate = currentUser.CreationDate,
                LastLoginDate = currentUser.LastLoginDate,
                IsApproved = currentUser.IsApproved,
            };

            /*SE MUESTRA DATOS DE TABLA Z QUE SE MANEJAN PARA LOS USUARIOS*/
            User_I EditUser = db.User_I.Find(id);

            ViewBag.CuotasPendientes = (from m in db.ModoPago
                                        where m.idModoPago == EditUser.idModoPago
                                        select m.n_cuotas).FirstOrDefault();

            return View(new ParentModelViewUser { UserModel = EditModel, User_I = EditUser });
        }

        //***********************************************************************************//
        // Autor:  									                	     				*//
        //***********************************************************************************//
        // Edit()	Acceso solo ADMINISTRADOR												*//
        // Acción que devuelve la vista que permite Editar un usuario especificada.     	*//
        // Método GET.																		*//
        // _________________________________________________________________________________*//
        // Entrada: 																		*//
        // •	id: identificador del Usuario que se desea editar.							*//
        // _________________________________________________________________________________*//
        // Salida:  Vista que posee la plantilla para Editar el usuario desado.	        	*//
        // _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        public ActionResult Edit(string id)
        {
            MembershipUser currentUser = Membership.GetUser(id);

            UserModel EditModel = new UserModel
            { 
                        UserName = currentUser.UserName,
                        Email = currentUser.Email,
                        CreationDate = currentUser.CreationDate,
                        LastLoginDate = currentUser.LastLoginDate,
                        IsApproved = currentUser.IsApproved,
            };

            /*SE MUESTRA DATOS DE TABLA Z QUE SE MANEJAN PARA LOS USUARIOS*/
            User_I EditUser = db.User_I.Find(id);

            ViewBag.CuotasPendientes = (from m in db.ModoPago
                                        where m.idModoPago == EditUser.idModoPago
                                        select m.n_cuotas).FirstOrDefault();

            ViewBag.idRol = new SelectList(db.Rol, "idRol", "name", EditUser.idRol);
            ViewBag.idTurno = new SelectList(db.Turno, "idTurno", "name", EditUser.idTurno);
            ViewBag.idSede = new SelectList(db.Sede, "idSede", "name", EditUser.idSede);
            ViewBag.idModoPago = new SelectList(db.ModoPago, "idModoPago", "name", EditUser.idModoPago);
            ViewBag.idFormaPago = new SelectList(db.FormaPago, "idFormaPago", "name", EditUser.idFormaPago);
            ViewBag.idFormaPago02 = new SelectList(db.FormaPago02, "idFormaPago02", "name", EditUser.idFormaPago02);
            ViewBag.idFormaPago03 = new SelectList(db.FormaPago03, "idFormaPago03", "name", EditUser.idFormaPago03);
            ViewBag.idStatus = new SelectList(db.Status, "idStatus", "name", EditUser.idStatus);

            ViewBag.idRolOLD = EditUser.idRol;

            return View(new ParentModelViewUser { UserModel = EditModel, User_I = EditUser });
        }

        //***********************************************************************************//
        // Autor:  									                	     				*//
        //***********************************************************************************//
        // Edit()	Acceso solo ADMINISTRADOR												*//
        // Acción que devuelve la vista que permite Editar un Usuario especificado.      	*//
        // Método POST.																		*//
        // _________________________________________________________________________________*//
        // Entrada: 																		*//
        // •	usuario: dato de tipo modelo, que representa un usuario, este es        	*//
        //		requerido para verificar que los datos suministrados son correctos,  para 	*//
        //		así Editar o enviar un mensaje de error en la aplicación.  					*//
        // _________________________________________________________________________________*//
        // Salida:  Vista que devuelve el usuario editado.					    			*//
        // _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        [HttpPost]
        public ActionResult Edit(ParentModelViewUser model, string idRol, int idTurno, int idSede, int idModoPago, int idStatus, int idFormaPago, int idFormaPago02, int idFormaPago03/*, string idRolOLD*/)
        {
            var CuotasPendientes = (from m in db.ModoPago
                                        where m.idModoPago == idModoPago
                                        select m.n_cuotas).FirstOrDefault();
            if (model.User_I.n_cuotas_pago <= CuotasPendientes)
            {
                if (ModelState.IsValid)
                {
                    /*SE MUESTRA DATOS DE TABLA Z QUE SE MANEJAN PARA LOS USUARIOS*/

                    model.User_I.UserName = model.UserModel.UserName;
                    model.User_I.idTurno = idTurno;
                    model.User_I.idSede = idSede;
                    model.User_I.idModoPago = idModoPago;
                    model.User_I.idFormaPago = idFormaPago;
                    model.User_I.idFormaPago02 = idFormaPago02;
                    model.User_I.idFormaPago03 = idFormaPago03;
                    model.User_I.idRol = idRol; //Guest_C, Guest_H, Guest_I   ******Guest_FAIL: Solo estará a Nivel de Asp Membership*******
                    model.User_I.idStatus = idStatus; //IdStatus = 1 Pendiente, IdStatus = 2 Aprobado, IdStatus = 3 Bloqueado idStatus= 4 Rechazado


                    var idRolOLD = Roles.GetRolesForUser(model.UserModel.UserName).FirstOrDefault();
                    Roles.RemoveUserFromRole(model.UserModel.UserName, idRolOLD);
                    Roles.AddUserToRole(model.UserModel.UserName, idRol);
                    //Roles.RemoveUserFromRole(model.UserModel.UserName, idRolOLD);
                    //Roles.AddUserToRole(model.UserModel.UserName, idRol);

                    MembershipUser currentUser = Membership.GetUser(model.UserModel.UserName);
                    if (idStatus == 3)
                    {
                        currentUser.IsApproved = false;
                    }
                    else
                    {
                        currentUser.IsApproved = true;
                    }
                    currentUser.Email = model.UserModel.Email;
                    Membership.UpdateUser(currentUser);

                    db.Entry(model.User_I).State = EntityState.Modified;
                    db.SaveChanges();


                    return RedirectToAction("SearchIndex");
                }
            }
            else
            {
                ModelState.AddModelError("", "El Número de Cuota no puede ser mayor a " + CuotasPendientes + ".");
            }

            ViewBag.CuotasPendientes = CuotasPendientes;

            ViewBag.idRol = new SelectList(db.Rol, "idRol", "name", idRol);
            ViewBag.idTurno = new SelectList(db.Turno, "idTurno", "name", idTurno);
            ViewBag.idSede = new SelectList(db.Sede, "idSede", "name", idSede);
            ViewBag.idModoPago = new SelectList(db.ModoPago, "idModoPago", "name", idModoPago);
            ViewBag.idFormaPago = new SelectList(db.FormaPago, "idFormaPago", "name", idFormaPago);
            ViewBag.idFormaPago02 = new SelectList(db.FormaPago02, "idFormaPago02", "name", idFormaPago02);
            ViewBag.idFormaPago03 = new SelectList(db.FormaPago03, "idFormaPago03", "name", idFormaPago03);
            ViewBag.idStatus = new SelectList(db.Status, "idStatus", "name", idStatus);
            
            return View(model);
        }

        //***********************************************************************************//
        // Autor:  		Adrian Di Puglia                               	     				*//
        //***********************************************************************************//
        // Delete()	Acceso solo ADMINISTRADOR												*//
        // Acción que devuelve la vista que permite eliminar un Usuario especificado.    	*//
        // Método GET.																		*//
        // _________________________________________________________________________________*//
        // Entrada: 																		*//
        // •	id: identificador del Usuario que se desea eliminar.						*//
        // _________________________________________________________________________________*//
        // Salida:  Vista que posee la plantilla para eliminar el Usuario desado.		    *//
        // _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        public ActionResult Delete(string id)
        {
            MembershipUser currentUser = Membership.GetUser(id);

            UserModel EditModel = new UserModel
            {
                UserName = currentUser.UserName,
                Email = currentUser.Email,
                CreationDate = currentUser.CreationDate,
                LastLoginDate = currentUser.LastLoginDate,
                IsApproved = currentUser.IsApproved
            };

            /*SE MUESTRA DATOS DE TABLA Z QUE SE MANEJAN PARA LOS USUARIOS*/
            User_I EditUser = db.User_I.Find(id);
                        
            ViewBag.CuotasPendientes = (from m in db.ModoPago
                                        where m.idModoPago == EditUser.idModoPago
                                        select m.n_cuotas).FirstOrDefault();

            return View(new ParentModelViewUser { UserModel = EditModel, User_I = EditUser });
        }

        //***********************************************************************************//
        // Autor:  									                	     				*//
        //***********************************************************************************//
        // DeleteConfirmed()	Acceso solo ADMINISTRADOR									*//
        // Acción que devuelve la vista que permite elimininar un Usuario especificado.     *//
        // Método POST.																		*//
        // _________________________________________________________________________________*//
        // Entrada: 																		*//
        // •	id: identificador del Usuario que va a eliminar.	    					*//
        // _________________________________________________________________________________*//
        // Salida:  Vista que muestra la eliminación del Usuario deseado.				    *//
        // _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        [HttpPost, ActionName("Delete")]
        public ActionResult DeleteConfirmed(string id)
        {
            MembershipUser currentUser = Membership.GetUser(id);
            Membership.DeleteUser(currentUser.UserName, true );

            /*SE DEBE TODA BORRAR LA DATA Z QUE SE MANEJARA PARA LOS USUARIOS*/

            //****** Borrado de POST CYT ******//
            var post_cyt = db.Post_CYT.Where(m => m.userName == id);

            foreach (var post in post_cyt)
            {
                db.Post_CYT.Remove(post);
            }

            //****** Borrado de RESPUESTAS PROBLEMARIOS ******//
            var respuesta_cyt = db.Respuesta.Where(m => m.UserName == id);

            foreach (var respuesta in respuesta_cyt)
            {
                db.Respuesta.Remove(respuesta);
            }

            //****** Borrado de PROBLEMARIOS USER_I ******//
            var problemario_user_i_cyt = db.Problemario_User_I.Where(m => m.UserName == id);

            foreach (var problemario_user_i in problemario_user_i_cyt)
            {
                db.Problemario_User_I.Remove(problemario_user_i);
            }

            User_I User = db.User_I.Find(id);
            db.User_I.Remove(User);

            db.SaveChanges();

            return RedirectToAction("SearchIndex");
        }


        //***********************************************************************************//
        // Autor: 			Adrian Di Puglia			                     				*//
        //***********************************************************************************//
        // RecuperarPassword()																*//
        // Acción Encargada de recuperar la contraseña de un Usuario. Método GET.			*//
        // _________________________________________________________________________________*//
        // Entrada:	none																	*//
        // _________________________________________________________________________________*//
        // Salida:  Vista que devuelve la plantilla de recuperación de contraseña	 del 	*//
        // sistema.																			*//
        // _________________________________________________________________________________*//
        public ActionResult RecuperarPassword()
        {
            return View();
        }


        //***********************************************************************************//
        // Autor: 								                		     				*//
        //***********************************************************************************//
        // RecuperarPassword()																*//
        // Acción Encargada de recuperar la contraseña de un Usuario. Método POST.			*//
        // _________________________________________________________________________________*//
        // Entrada:																			*//
        // •	model: modelo de tipo usuario del sistema requerido para verificar que los 	*//
        //		datos suministrados de usuario son correctos,  para así permitir o negar la *//
        //		recuperación de contrseña. 													*//
        // _________________________________________________________________________________*//
        // Salida:  Vista que devuelve la recuperación de contraseña del sistema.			*//																		*//
        // _________________________________________________________________________________*//
        [HttpPost]
        public ActionResult RecuperarPassword(getPassword model)
        {
            //Se obtiene el ID del usuario deseado
            MembershipUser currentUser = Membership.GetUser(model.UserName);

            if (currentUser != null)
            {
                //Si el usuario existe se resetea su password
                currentUser.ResetPassword();
                string newPassword = currentUser.GetPassword();

                /***********************************************************************************************/
                /******************************* ENVÍO DE CORREO DE NOTIFICACIÓN *******************************/
                /***********************************************************************************************/

                //Creación de los Datos del correo con la nueva Password generada
                var bodySendCorreo = "El cambio de contraseña. La nueva contraseña es: " + newPassword;
                var subjectSend = "CYT Cambio de Contraseña";
                var msn = "";


                    //Envio de correo
                    var result=sendEmail(currentUser.Email, subjectSend, bodySendCorreo, true);
                    if (result)
                    {
                        msn = "Se envió la nueva contraseña al correo: " + currentUser.Email + ", con ésta podrá ingresar al sistema para luego realizar el cambio a la contraseña deseada.";
                    }
                    else
                    {
                        msn = "No se pudo enviar el correo debido a problemas con el servidor";
                    }

                /***********************************************************************************************/
                /***********************************************************************************************/

                return RedirectToAction("LogOn", "Account", new { registro = msn });
            }
            else
            {
                ViewBag.Error = "El Usuario no Existe";
            }

            return View(model);
        }


        //***********************************************************************************//
        // Autor:  									                	     				*//
        //***********************************************************************************//
        // CuotasGuest()	                    											*//
        // Acción que devuelve la vista que permite Editar una cuota usuario especificada. 	*//
        // Método GET.																		*//
        // _________________________________________________________________________________*//
        // Entrada: 																		*//
        // •	id: identificador del Usuario que se desea editar cuota.					*//
        // _________________________________________________________________________________*//
        // Salida:  Vista que posee la plantilla para Editar cuota el usuario desado.	   	*//
        // _________________________________________________________________________________*//
        [Authorize (Roles = "Guest_C, Guest_H, Guest_I, Guest_FAIL")]
        public ActionResult CuotasGuest()
        {
            
            /*SE MUESTRA DATOS DE TABLA Z QUE SE MANEJAN PARA LOS USUARIOS*/
            User_I EditUser = db.User_I.Find(User.Identity.Name);

            ViewBag.CuotasPendientes = (from m in db.ModoPago
                                        where m.idModoPago == EditUser.idModoPago
                                        select m.n_cuotas).FirstOrDefault();

            ViewBag.UserName = User.Identity.Name;
            ViewBag.idModoPago = new SelectList(db.ModoPago, "idModoPago", "name", EditUser.idModoPago);
            ViewBag.idFormaPago = new SelectList(db.FormaPago, "idFormaPago", "name", EditUser.idFormaPago);
            ViewBag.idFormaPago02 = new SelectList(db.FormaPago02, "idFormaPago02", "name", EditUser.idFormaPago02);
            ViewBag.idFormaPago03 = new SelectList(db.FormaPago03, "idFormaPago03", "name", EditUser.idFormaPago03);
            ViewBag.idStatus = new SelectList(db.Status, "idStatus", "name", EditUser.idStatus);

            return View(EditUser);
        }


        //***********************************************************************************//
        // Autor:  									                	     				*//
        //***********************************************************************************//
        // CuotasGuest()	Acceso solo ADMINISTRADOR										*//
        // Acción que devuelve la vista que permite Editar una cuota Usuario especificado. 	*//
        // Método POST.																		*//
        // _________________________________________________________________________________*//
        // Entrada: 																		*//
        // •	usuario: dato de tipo modelo, que representa un usuario, este es        	*//
        //		requerido para verificar que los datos suministrados son correctos,  para 	*//
        //		así Editar o enviar un mensaje de error en la aplicación.  					*//
        // _________________________________________________________________________________*//
        // Salida:  Vista que devuelve el usuario editado cuota.			    			*//
        // _________________________________________________________________________________*//
        [Authorize(Roles = "Guest_C, Guest_H, Guest_I, Guest_FAIL")]
        [HttpPost]
        public ActionResult CuotasGuest(string UserName, int idFormaPago02, int idFormaPago03, string n_transaction02, string n_transaction03)
        {
                

                /*SE MUESTRA DATOS DE TABLA Z QUE SE MANEJAN PARA LOS USUARIOS*/
                User_I UserCuota = db.User_I.Find(UserName);

                //UserCuota.idFormaPago = idFormaPago;
                //UserCuota.n_transaction = n_transaction;
                //UserCuota.transactionDate = DateTime.Now.Date;

                if(UserCuota.n_cuotas_pago==1)
                {
                    UserCuota.idFormaPago02 = idFormaPago02;
                    UserCuota.n_transaction02 = n_transaction02;
                    UserCuota.transactionDate02 = DateTime.Now.Date;
                    UserCuota.verificado02 = "NO";
                }
                else if(UserCuota.n_cuotas_pago == 2)
                {
                    UserCuota.idFormaPago03 = idFormaPago03;
                    UserCuota.n_transaction03 = n_transaction03;
                    UserCuota.transactionDate03 = DateTime.Now.Date;
                    UserCuota.verificado03 = "NO";
                }

                UserCuota.n_cuotas_pago = UserCuota.n_cuotas_pago + 1;
                UserCuota.idStatus = 1;

                db.Entry(UserCuota).State = EntityState.Modified;
                db.SaveChanges();

                /***********************************************************************************************/
                /******************************* ENVÍO DE CORREO DE NOTIFICACIÓN *******************************/
                /***********************************************************************************************/
                var turno = db.Turno.Find(UserCuota.idTurno).name;
                var sede = db.Sede.Find(UserCuota.idSede).name;
                var cuotas = db.ModoPago.Find(UserCuota.idModoPago).n_cuotas;
                var to = db.Mail.Find(1).name;
                var bodySendCorreo = "Estimado ADMINISTRADOR: <br /> <br />SE REQUIERE LA PRONTA VALIDACIÓN DEL PAGO DE CUOTAS (" +
                                     + UserCuota.n_cuotas_pago + "/" + cuotas + ") correspondientes al estudiante "+
                                     "<font style='text-transform: uppercase;'>" + UserCuota.name + " " + UserCuota.last_name + "</font>" +
                                     " de N° de C.I.: V-" + UserCuota.UserName + " perteneciente al Turno <font style='text-transform: uppercase;'>" + turno +
                                     "</font> en la sede <font style='text-transform: uppercase;'>" + sede + "</font>.";
                var subjectSend = "CYT Validación de Cuota (" + UserCuota.n_cuotas_pago + "/" + cuotas + ") " + UserCuota.UserName + ".";
                var msn = "";

                //Envio de correo
                var result = sendEmail(to, subjectSend, bodySendCorreo, true);
                if (result)
                {
                    msn = "Correo de Validación de Cuota enviado Correctamente";
                }
                else
                {
                    msn = "No se pudo enviar el Correo de Validación de Cuota debido a problemas con el servidor";
                }

                /***********************************************************************************************/
                /***********************************************************************************************/

                return RedirectToAction("Index", "Home", new { msn = msn });

        }

        //***********************************************************************************//
        // Autor:  		Adrian Di Puglia			                	     				*//
        //***********************************************************************************//
        // SearchCoutas()	Acceso ADMINISTRADOR						        			*//
        // Acción que devuelve la vista de todos los ítems de Coutas listados, 		        *//
        // 	paginados y con opción de búsqueda.												*//
        // _________________________________________________________________________________*//
        // Entrada: 																		*//
        // •	Page: entero que denota el numero de pagina que se tiene en la lista de 	*//
        // 		búsqueda, por defecto es 1.													*//
        // •	Parámetros con prefijo search: caracteres por los cuales se va a filtrar la *//
        // 		búsqueda. 																	*//
        // •	Parámetros con prefijo current: caracteres que guardan la ultima búsqueda de*// 
        // 		filtrado para mantenerla durante los cambios de página. 					*//
        // _________________________________________________________________________________*//
        // Salida:  Vista que posee todos los Usuarios y cuotas  y listados deseados.	    *//
        // _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        public ActionResult SearchCuotas(string msn, int? SearchTurno, int? SearchSede, int? SearchModoPago, string SearchRol, int? page = 1)
        {

            var user = db.User_I.AsQueryable();
            var User_IList = new List<User_I>();

            //Metodo GET Inicializar las variables con los valores de busqueda introducidos
            if (Request.HttpMethod == "GET")
            {
                ViewBag.SearchTurno = new SelectList(db.Turno, "idTurno", "name");
                ViewBag.SearchSede = new SelectList(db.Sede, "idSede", "name");
                ViewBag.SearchModoPago = new SelectList(db.ModoPago, "idModoPago", "name");
                ViewBag.SearchRol = new SelectList(db.Rol, "idRol", "name");
                ViewBag.msn = msn;
            }
            else
            {
                page = 1;
            }

            //Metodo POST Inicializar las variables con los valores de busqueda introducidos
            ViewBag.SearchTurno = new SelectList(db.Turno, "idTurno", "name", SearchTurno);
            ViewBag.CurrentTurno = SearchTurno;

            ViewBag.SearchSede = new SelectList(db.Sede, "idSede", "name", SearchSede);
            ViewBag.CurrentSede = SearchSede;

            ViewBag.SearchModoPago = new SelectList(db.ModoPago, "idModoPago", "name", SearchModoPago);
            ViewBag.CurrentModoPago = SearchModoPago;

            ViewBag.SearchRol = new SelectList(db.Rol, "idRol", "name", SearchRol);
            ViewBag.CurrentRol = SearchRol;


            int pageSize = 10;
            int pageIndex = (page ?? 1);

            //Filtrado por los parametros en entrada capturado en al interfaz
            if (SearchTurno == null && SearchSede == null && SearchModoPago == null && SearchRol == null)
            {
                User_IList = user.ToList();
            }
            else
            {
                if (SearchTurno != null)
                {
                    user = user.Where(m => m.idTurno == SearchTurno);
                }

                if (SearchSede != null)
                {
                    user = user.Where(m => m.idSede == SearchSede);
                }

                if (SearchModoPago != null)
                {
                    user = user.Where(m => m.idModoPago == SearchModoPago);
                }

                if (SearchRol != "" && SearchRol != null)
                {
                    user = user.Where(m => m.idRol == SearchRol);
                }
            }

            //Solo muestro solicitudes en Status Pendiente
            user = user.Where(m => m.idStatus == 1);
            //Ordenar los User del return
            User_IList = user.OrderBy(x => x.registerDate).ToList();

            return View(User_IList.ToPagedList(pageIndex, pageSize));
        }


        //***********************************************************************************//
        // Autor:  									                	     				*//
        //***********************************************************************************//
        // CuotasAdmin()	                    											*//
        // Acción que devuelve la vista que permite Editar una cuota usuario especificada. 	*//
        // Método GET.																		*//
        // _________________________________________________________________________________*//
        // Entrada: 																		*//
        // •	id: identificador del Usuario que se desea editar cuota.					*//
        // _________________________________________________________________________________*//
        // Salida:  Vista que posee la plantilla para Editar cuota el usuario desado.	   	*//
        // _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        public ActionResult CuotasAdmin(string id)
        {

            /*SE MUESTRA DATOS DE TABLA Z QUE SE MANEJAN PARA LOS USUARIOS*/
            User_I EditUser = db.User_I.Find(id);

            ViewBag.CuotasPendientes = (from m in db.ModoPago
                                        where m.idModoPago == EditUser.idModoPago
                                        select m.n_cuotas).FirstOrDefault();

            ViewBag.UserName = EditUser.UserName;
            ViewBag.idModoPago = new SelectList(db.ModoPago, "idModoPago", "name", EditUser.idModoPago);
            ViewBag.idFormaPago = new SelectList(db.FormaPago, "idFormaPago", "name", EditUser.idFormaPago);
            ViewBag.idFormaPago02 = new SelectList(db.FormaPago02, "idFormaPago02", "name", EditUser.idFormaPago02);
            ViewBag.idFormaPago03 = new SelectList(db.FormaPago03, "idFormaPago03", "name", EditUser.idFormaPago03);
            ViewBag.idStatus = new SelectList(db.Status, "idStatus", "name", EditUser.idStatus);

            return View(EditUser);
        }

        //***********************************************************************************//
        // Autor:  									                	     				*//
        //***********************************************************************************//
        // CuotasGuest()	Acceso solo ADMINISTRADOR										*//
        // Acción que devuelve la vista que permite Editar una cuota Usuario especificado. 	*//
        // Método POST.																		*//
        // _________________________________________________________________________________*//
        // Entrada: 																		*//
        // •	usuario: dato de tipo modelo, que representa un usuario, este es        	*//
        //		requerido para verificar que los datos suministrados son correctos,  para 	*//
        //		así Editar o enviar un mensaje de error en la aplicación.  					*//
        // _________________________________________________________________________________*//
        // Salida:  Vista que devuelve el usuario editado cuota.			    			*//
        // _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        [HttpPost]
        public ActionResult CuotasAdmin(string Aprobar, string Denegar, string UserName, string reject_cause)
        {
            User_I UserCuota = db.User_I.Find(UserName);
            var msn = "";

            if (Denegar == null) //Opción APROBAR Cuota (Denegar == NULL)
            {
                /*SE MUESTRA DATOS DE TABLA Z QUE SE MANEJAN PARA LOS USUARIOS*/
                if (UserCuota.n_cuotas_pago == 1)
                {
                    UserCuota.verificado = "SI";
                }
                else if (UserCuota.n_cuotas_pago == 2)
                {
                    UserCuota.verificado02 = "SI";
                }
                else if (UserCuota.n_cuotas_pago == 3)
                {
                    UserCuota.verificado03 = "SI";
                }
                /*Apruebo al Usuario Seleccionado*/
                UserCuota.idStatus = 2;

                MembershipUser currentUser = Membership.GetUser(UserName);
                currentUser.IsApproved = true;

                var idRolOLD = Roles.GetRolesForUser(currentUser.UserName).FirstOrDefault();
                Roles.RemoveUserFromRole(currentUser.UserName, idRolOLD);
                Roles.AddUserToRole(currentUser.UserName, UserCuota.idRol);

                Membership.UpdateUser(currentUser);

                db.Entry(UserCuota).State = EntityState.Modified;
                db.SaveChanges();

                if (UserCuota.n_cuotas_pago == 1)
                {
                    /***********************************************************************************************/
                    /******************** ENVÍO DE CORREO DE NOTIFICACIÓN APROBACIÓN 1era CUOTA ********************/
                    /***********************************************************************************************/
                    var turno = db.Turno.Find(UserCuota.idTurno).name;
                    var sede = db.Sede.Find(UserCuota.idSede).name;
                    var cuotas = db.ModoPago.Find(UserCuota.idModoPago).n_cuotas;
                    var to = currentUser.Email + "," + UserCuota.parent_email;
                    var bodySendCorreo = "La solicitud de inscripción correspondiente al estudiante " +
                                         "<font style='text-transform: uppercase;'>" + UserCuota.name + " " + UserCuota.last_name + "</font>" +
                                         " de N° de C.I.: V-" + UserCuota.UserName + " para el Turno <font style='text-transform: uppercase;'>" + turno +
                                         "</font> en la sede <font style='text-transform: uppercase;'>" + sede + "</font> ha sido <b>APROBADA</b>. "+
                                         "A partir de ahora puede ingresar al sistema con el usuario " + UserCuota.UserName + " y su contraseña de Registro.<br /><br />"+
                                         "Reciba una cordial bienvenida, y ¡Recuerde que él único camino al verdadero exito está en la constancia y el trabajo duro!.<br /><br />"+
                                         "Cuotas pagadas: (" + UserCuota.n_cuotas_pago + "/" + cuotas + ").";
                    var subjectSend = "CYT Respuesta Solicitud Inscripción, Cuota (" + UserCuota.n_cuotas_pago + "/" + cuotas + ") " + UserCuota.UserName + ".";
                    

                    //Envio de correo
                    var result = sendEmail(to, subjectSend, bodySendCorreo, true);
                    if (result)
                    {
                        msn = "Correo de Respuesta de Cuota enviado Correctamente";
                    }
                    else
                    {
                        msn = "No se pudo enviar el Correo de Respuesta de Cuota debido a problemas con el servidor";
                    }

                    /***********************************************************************************************/
                    /***********************************************************************************************/
                }
                else if (UserCuota.n_cuotas_pago == 2 || UserCuota.n_cuotas_pago == 3)
                {
                    /***********************************************************************************************/
                    /****************** ENVÍO DE CORREO DE NOTIFICACIÓN APROBACIÓN 2da/3era CUOTA ******************/
                    /***********************************************************************************************/
                    var turno = db.Turno.Find(UserCuota.idTurno).name;
                    var sede = db.Sede.Find(UserCuota.idSede).name;
                    var cuotas = db.ModoPago.Find(UserCuota.idModoPago).n_cuotas;
                    var to = currentUser.Email + "," + UserCuota.parent_email;
                    var bodySendCorreo = "El pago de la CUOTA N° ("  + UserCuota.n_cuotas_pago + ") del curso, correspondiente al estudiante "+
                                         "<font style='text-transform: uppercase;'>" + UserCuota.name + " " + UserCuota.last_name + "</font>" +
                                         " de N° de C.I.: V-" + UserCuota.UserName + " para el Turno <font style='text-transform: uppercase;'>" + turno +
                                         "</font> en la sede <font style='text-transform: uppercase;'>" + sede + "</font> ha sido <b>VALIDADA</b>. <br /><br />" +
                                         "Cuotas pagadas: (" + UserCuota.n_cuotas_pago + "/" + cuotas + ").";
                    var subjectSend = "CYT Respuesta de Cuota (" + UserCuota.n_cuotas_pago + "/" + cuotas + ") " + UserCuota.UserName + ".";


                    //Envio de correo
                    var result = sendEmail(to, subjectSend, bodySendCorreo, true);
                    if (result)
                    {
                        msn = "Correo de Respuesta de Cuota enviado Correctamente";
                    }
                    else
                    {
                        msn = "No se pudo enviar el Correo de Respuesta de Cuota debido a problemas con el servidor";
                    }

                    /***********************************************************************************************/
                    /***********************************************************************************************/
                }
            }
            else if (Aprobar == null) //Opción DENEGAR Cuota (Aprobar == NULL)
            {
                var cuota = UserCuota.n_cuotas_pago;
                /*SE MUESTRA DATOS DE TABLA Z QUE SE MANEJAN PARA LOS USUARIOS*/
                if (UserCuota.n_cuotas_pago == 1)
                {
                    MembershipUser currentU = Membership.GetUser(UserCuota.UserName);
                    /***********************************************************************************************/
                    /********************* ENVÍO DE CORREO DE NOTIFICACIÓN NEGACIÓN 1era CUOTA *********************/
                    /***********************************************************************************************/
                    var turno = db.Turno.Find(UserCuota.idTurno).name;
                    var sede = db.Sede.Find(UserCuota.idSede).name;
                    var cuotas = db.ModoPago.Find(UserCuota.idModoPago).n_cuotas;
                    var to = currentU.Email + "," + UserCuota.parent_email;
                    var bodySendCorreo = "La solicitud de inscripción correspondiente al estudiante " +
                                         "<font style='text-transform: uppercase;'>" + UserCuota.name + " " + UserCuota.last_name + "</font>" +
                                         " de N° de C.I.: V-" + UserCuota.UserName + " para el Turno <font style='text-transform: uppercase;'>" + turno +
                                         "</font> en la sede <font style='text-transform: uppercase;'>" + sede + "</font> ha sido <b>DENEGADA</b>. " + reject_cause + "<br /><br />" +
                                         "Por favor comuníquese a los teléfonos descritos al final del correo, para resolver cualquier inconveniente relacionado " +
                                         "con su solicitud.";
                    var subjectSend = "CYT Respuesta Solicitud Inscripción, Cuota (" + UserCuota.n_cuotas_pago + "/" + cuotas + ") " + UserCuota.UserName + ".";


                    //Envio de correo
                    var result = sendEmail(to, subjectSend, bodySendCorreo, true);
                    if (result)
                    {
                        msn = "Correo de Respuesta de Cuota enviado Correctamente";
                    }
                    else
                    {
                        msn = "No se pudo enviar el Correo de Respuesta de Cuota debido a problemas con el servidor";
                    }

                    /***********************************************************************************************/
                    /***********************************************************************************************/

                    //****** Borrado de PROBLEMARIOS USER_I ******//
                    var problemario_user_i_cyt = db.Problemario_User_I.Where(m => m.UserName == UserName);

                    foreach (var problemario_user_i in problemario_user_i_cyt)
                    {
                        db.Problemario_User_I.Remove(problemario_user_i);
                    }

                    //****** Borrado de ASP.NET MEMBERSHIP ******//
                    Membership.DeleteUser(UserCuota.UserName, true);

                    //****** Borrado de ASP.NET USER_I *****//
                    User_I EditUser = db.User_I.Find(UserName);
                    db.User_I.Remove(EditUser);
                    db.SaveChanges();

                    return RedirectToAction("SearchCuotas", new { msn = msn });
                }
                else if (UserCuota.n_cuotas_pago == 2)
                {
                    UserCuota.n_cuotas_pago = UserCuota.n_cuotas_pago - 1;
                    UserCuota.n_transaction02 = null;
                    UserCuota.transactionDate02 = null;
                    UserCuota.verificado02 = null;
                }
                else if (UserCuota.n_cuotas_pago == 3)
                {
                    UserCuota.n_cuotas_pago = UserCuota.n_cuotas_pago - 1;
                    UserCuota.n_transaction03 = null;
                    UserCuota.transactionDate03 = null;
                    UserCuota.verificado03 = null;
                }
                /*Apruebo al Usuario Seleccionado*/
                UserCuota.idStatus = 4;

                MembershipUser currentUser = Membership.GetUser(UserName);
                currentUser.IsApproved = true;

                var idRolOLD = Roles.GetRolesForUser(currentUser.UserName).FirstOrDefault();
                Roles.RemoveUserFromRole(currentUser.UserName, idRolOLD);
                Roles.AddUserToRole(currentUser.UserName, "Guest_FAIL");

                Membership.UpdateUser(currentUser);

                db.Entry(UserCuota).State = EntityState.Modified;
                db.SaveChanges();

                if (cuota == 2 || cuota == 3)
                {
                    /***********************************************************************************************/
                    /******************* ENVÍO DE CORREO DE NOTIFICACIÓN NEGACIÓN 2da/3era CUOTA *******************/
                    /***********************************************************************************************/
                    var turno = db.Turno.Find(UserCuota.idTurno).name;
                    var sede = db.Sede.Find(UserCuota.idSede).name;
                    var cuotas = db.ModoPago.Find(UserCuota.idModoPago).n_cuotas;
                    var to = currentUser.Email + "," + UserCuota.parent_email;
                    var bodySendCorreo = "El pago de la CUOTA N° (" + cuota + ") del curso, correspondiente al estudiante " +
                                         "<font style='text-transform: uppercase;'>" + UserCuota.name + " " + UserCuota.last_name + "</font>" +
                                         " de N° de C.I.: V-" + UserCuota.UserName + " para el Turno <font style='text-transform: uppercase;'>" + turno +
                                         "</font> en la sede <font style='text-transform: uppercase;'>" + sede + "</font> ha sido <b>DENEGADA</b>. " + reject_cause + "<br /><br />" +
                                         "Por favor ingrese nuevamente y cargue correctamente su Cuota de Pago. <br /> <br />"+
                                         "Cuotas pagadas: (" + UserCuota.n_cuotas_pago + "/" + cuotas + ").";
                    var subjectSend = "CYT Respuesta de Cuota (" + cuota + "/" + cuotas + ") " + UserCuota.UserName + ".";


                    //Envio de correo
                    var result = sendEmail(to, subjectSend, bodySendCorreo, true);
                    if (result)
                    {
                        msn = "Correo de Respuesta de Cuota enviado Correctamente";
                    }
                    else
                    {
                        msn = "No se pudo enviar el Correo de Respuesta de Cuota debido a problemas con el servidor";
                    }

                    /***********************************************************************************************/
                    /***********************************************************************************************/
                }

            }
            return RedirectToAction("SearchCuotas", new { msn = msn });

        }

        //***********************************************************************************//
        // Autor:  		Adrian Di Puglia    			                     				*//
        //***********************************************************************************//
        // verificaCupo()																	*//
        // Función que se encarga de enviar los correos del sistema							*//														 			
        // _________________________________________________________________________________*//
        // Entrada: 																		*//
        // •	idTurno: Número de Turno Asocicado                                          *//
        // •	idSede: Número de Sede Asocicada                                            *//
        // _________________________________________________________________________________*//
        // Salida: Capacidad de Turno.          											*//
        // _________________________________________________________________________________*//
        public bool verificaCupo(int idTurno, int idSede)
        {
            var result = true;
            var cupo = db.User_I.Where(m => m.idTurno == idTurno && m.idSede == idSede).Count();

            //Turno Viernes - Colegio SA
            if (idTurno == 1 && idSede == 1 && cupo>=100) {
                    result = false;
            }
            //Turno Viernes - Colegio JMVA
            if (idTurno == 1 && idSede == 2) {
                    result = false;
            }
            //Turno Sabado - Colegio SA
            if (idTurno == 2 && idSede == 1 /*&& cupo>=90*/) {
                    result = false;
            }
            //Turno Sabado - Colegio JMV
            if (idTurno == 2 && idSede == 2 && cupo>=100) {
                    result = false;
            }

            return (result);
        }

        //***********************************************************************************//
        // Autor:  										                     				*//
        //***********************************************************************************//
        // sendEmail()																		*//
        // Función que se encarga de enviar los correos del sistema							*//														 			
        // _________________________________________________________________________________*//
        // Entrada: 																		*//
        // •	cc: Lista de correso separados por , a los cuales se desea enviar el mensaje*//
        // •	subject: subject que se va a enviar con el correo							*//	
        // •	body: cuerpo que se va a enviar con el correo								*//	
        // •	isBodyHtml: cboleano que dice si el cuerpo del correo es en formatao HTML	*//		
        // _________________________________________________________________________________*//
        // Salida:  Devuelve el envio de correo.											*//
        // _________________________________________________________________________________*//
        public bool sendEmail(string cc, string subject, string body, bool isBodyHtml)
        {
            var result=true;
            //Creación del objeto para enviar correo electronicos
            var mailMessage = new System.Net.Mail.MailMessage();

            string header = "Saludos, <br /><br />EL CURSO PRE-UNIVERSITARIO CRECE Y TRIUNFA INFORMA: <br /><br />";
            //Colocando el destinatario del correo
            mailMessage.To.Add(cc);
            //Estableciendo que el cuerpo del correo es en el formato Html
            mailMessage.IsBodyHtml = isBodyHtml;
            //Título del correo
            mailMessage.Subject = subject;
            //Mensaje del correo
            //Colocando el remitente del correo
            mailMessage.From = new MailAddress("postmaster@creceytriunfa.com");

            // --------------------- op 1 -------------- //
            string footer = "<br /><br />Crece Y Triunfa<br /> <br />Se inteligente... ¡Aprovecha el Tiempo!<br /><br /><br /><div style=\"font-size:14px\" >Este mensaje fue enviado automáticamente por el sistema CYT. RIF: J-40135444-0<br /><hr /><br />" +
                          "<table style=\"font-size:14px\" border=\"0\">" +
                            "<tr>" +
                                "<td>Jessica Pernía</td>" +
                                "<td>Jonás Gonzales</td>" +
                                "<td>Rayan Arroyo</td>" +
                                "</tr>" +
                                "<tr>" +
                                "<td>+58(416)4211556</td>" +
                                "<td>+58(412)2928347</td>" +
                                "<td>+58(414)1534241</td>" +
                            "</tr>" +
                          "</table><br /></div>" +
                          "<img src=\"@@IMAGE@@\" alt=\"\">";


            //string attachmentPath =  @"\comprometidosconmonaca.png";
            string path = Server.MapPath(@"~\Content\images\LogotipoSinRIF.png");

            //generate the contentID string using the datetime
            string contentID = Path.GetFileName(path).Replace(".", "") + "@zofm";

            //create the INLINE attachment<
            Attachment inline = new Attachment(path);
            inline.ContentDisposition.Inline = true;
            inline.ContentDisposition.DispositionType = DispositionTypeNames.Inline;
            inline.ContentId = contentID;
            inline.ContentType.MediaType = "image/png";
            inline.ContentType.Name = Path.GetFileName(path);
            mailMessage.Attachments.Add(inline);

            // replace the tag with the correct content ID
            footer = footer.Replace("@@IMAGE@@", "cid:" + contentID);
            mailMessage.Body = header + body +footer;
            try
            {
                //Envio del correo.
                SmtpClient mailSender = new SmtpClient("mail.creceytriunfa.com"); //use this if you are in the development server
                NetworkCredential Credentials = new NetworkCredential("postmaster@creceytriunfa.com", "Asp18745490!");
                mailSender.Credentials = Credentials;
                mailSender.Send(mailMessage);
            }
            catch(Exception ex)
            {
                Response.Write("Could not send the e-mail - error: " + ex.Message);
                result=false;
            }
            return (result);
        }

        #region Status Codes
        private static string ErrorCodeToString(MembershipCreateStatus createStatus)
        {
            // See http://go.microsoft.com/fwlink/?LinkID=177550 for
            // a full list of status codes.
            switch (createStatus)
            {
                case MembershipCreateStatus.DuplicateUserName:
                    return "Nombre de usuario ya existe. Por favor, introduzca un nombre de usuario diferente.";

                case MembershipCreateStatus.DuplicateEmail:
                    return "Dirección de correo ya existe. Por favor, introduce una dirección de correo electrónico diferente.";

                case MembershipCreateStatus.InvalidPassword:
                    return "La contraseña no es válida. Por favor, rellena contraseña válida.";

                case MembershipCreateStatus.InvalidEmail:
                    return "La dirección de correo electrónico proporcionada no es válida. Por favor, compruebe el valor y vuelva a intentarlo.";

                case MembershipCreateStatus.InvalidAnswer:
                    return "La respuesta de recuperación de contraseña facilitada no es válida. Por favor, compruebe el valor y vuelva a intentarlo.";

                case MembershipCreateStatus.InvalidQuestion:
                    return "La contraseña de recuperación de pregunta siempre es inválido. Por favor, compruebe el valor y vuelva a intentarlo.";

                case MembershipCreateStatus.InvalidUserName:
                    return "El nombre de usuario proporcionado no es válido. Por favor, compruebe el valor y vuelva a intentarlo.";

                case MembershipCreateStatus.ProviderError:
                    return "El proveedor de autenticación devuelve un error. Por favor, compruebe los datos e inténtelo de nuevo. Si el problema persiste, póngase en contacto con el administrador del sistema.";

                case MembershipCreateStatus.UserRejected:
                    return "La solicitud de creación de usuario ha sido cancelada. Por favor, compruebe los datos e inténtelo de nuevo. Si el problema persiste, póngase en contacto con el administrador del sistema";

                default:
                    return "Se ha producido un error desconocido. Por favor, compruebe los datos e inténtelo de nuevo. Si el problema persiste, póngase en contacto con el administrador del sistema.";
            }
        }
        #endregion
    }
}
